前言
组合式API 用在 setup
处。本章通过一个组件示例,感受组合式API的魅力。
1 | // src/components/UserRepositories.vue |
该组件有以下几个职责:
从假定的外部 API 获取该用户名的仓库,并在用户更改时刷新它
使用
searchQuery
字符串搜索存储库
setup
组件选项
新的 setup
组件选项在创建组件之前执行,一旦 props
被解析,并充当合成 API 的入口点。
WARNING:由于在执行
setup
时尚未创建组件实例,因此在setup
选项中没有this
。这意味着,除了props
之外,你将无法访问组件中声明的任何属性——本地状态、计算属性或方法。
1 | // src/components/UserRepositories.vue `setup` function |
但是这么写,我们的 repositories
变量是非响应式的,值变化并不会进行视图更新。
带 ref
的响应式变量
在 Vue 3.0 中,我们可以通过一个新的 ref
函数使任何响应式变量在任何地方起作用。ref
接受参数并返回它包装在具有 value
property 的对象中,然后可以使用该 property 访问或更改响应式变量的值:
1 | import { ref } from 'vue' |
换句话说,
ref
对我们的值创建了一个响应式引用。使用引用的概念将在整个组合式 API 中经常使用。
现在,我们把前面的例子改造一下,把 repositories
变成响应式的。
1 | // src/components/UserRepositories.vue `setup` function |
生命周期钩子注册内部 setup
组合式 API 上的生命周期钩子与选项式 API 的名称相同,但前缀为 on
:即 mounted
看起来像 onMounted
。这些函数接受在组件调用钩子时将执行的回调。让我们将其添加到 setup
函数中:
1 | // src/components/UserRepositories.vue `setup` function |
watch
响应式更改
我们可以使用从 Vue 导入的 watch
函数执行相同的操作。它接受 3 个参数:
- 一个响应式引用或我们想要侦听的 getter 函数
- 一个回调
- 可选的配置选项
下面让我们快速了解一下它是如何工作的
1 | import { ref, watch } from 'vue' |
例如,每当 counter
被修改时 counter.value=5
,watch 将触发并执行回调 (第二个参数),在本例中,它将把 'The new counter value is:5'
记录到我们的控制台中。
以下是等效的选项式 API:
1 | export default { |
现在我们将其应用到我们的示例中:
1 | // src/components/UserRepositories.vue `setup` function |
你可能已经注意到在我们的 setup
的顶部使用了 toRefs
。这是为了确保我们的侦听器能够对 user
prop 所做的更改做出反应。
独立的 computed
属性
与 ref
和 watch
类似,也可以使用从 Vue 导入的 computed
函数在 Vue 组件外部创建计算属性。让我们回到我们的 counter 例子:
1 | import { ref, computed } from 'vue' |
在这里,computed
函数返回一个作为 computed
的第一个参数传递的 getter 类回调的输出的一个只读的响应式引用。为了访问新创建的计算变量的 value,我们需要像使用 ref
一样使用 .value
property。
现在我们将其应用到我们的示例中:
1 | // src/components/UserRepositories.vue `setup` function |
组合式函数
获取用户仓库信息:
1 | // src/composables/useUserRepositories.js |
搜索功能:
1 | // src/composables/useRepositoryNameSearch.js |
现在在单独的文件中有了这两个功能,我们就可以开始在组件中使用它们了。以下是如何做到这一点:
1 | // src/components/UserRepositories.vue |